# 创建一个函数，求任意数的阶乘
# 1！ = 1
# 2！ = 1 * 2 =2
# 3！ = 1 * 2 * 3 =6
# ......
# 10! = 1 * 2 * ... * 10 = 3628800


def factorial(num):
    '''
        该函数用来求任意数的阶乘

        参数num：
            要求阶乘的数字
    '''
    # 创建一个变量来保存结果
    result = 1
    for i in range(num):
        i += 1
        result *= i
    return result


print(factorial(10))

help(factorial)


# 递归式函数
# 递归简单理解就是自己去引用自己，在函数中自己调用自己

# 无穷递归，如果这个函数被调用，程序会内存溢出，效果类似于死循环
# def fn():
#     fn()

# fn()

# 递归使我们解决问题的一种方式，和循环很像，它的整体思想是，将一个大问题分解成一个个小问题，直到问题无法分解时，再去解决问题
# 递归式函数的两个要件：
# 1.基线条件
#   - 问题可以被分解为的最小问题，当满足基线条件时，递归就不在执行了
# 2.递归条件
#   - 将问题继续分解的条件


def factorial1(num):
    '''
        该函数用来求任意数的阶乘

        参数num：
            要求阶乘的数字
    '''
    # 基线条件，判断num是否为1，如果为1就不能在继续递归
    if num == 1:
        # 1的阶乘就是1
        return 1
    # 递归条件
    return num * factorial1(num - 1)


print(factorial1(10))


# 练习
# 创建一个函数power来为任意数字做幂运算 n ** i


def power(n, i):
    '''
        power()用来为任意数字做幂运算

        参数：
            n 要做幂运算的数字
            i 做幂运算的次数
    '''
    # 基线条件，判断i是否为0，如果为0就不能继续递归
    if i == 0:
        return 1
    # 递归条件
    return n * power(n, i - 1)


print(power(10, 0))
print(power(10, 10))


# 创建一个函数，用来检查一个任意字符串是否是回文字符串，如果是就返回True，若不是就返回False
# 回文字符串，字符串从前往后念和从后往前念是一样的
#       abcba
# 先检查第一个和最后一个字符是否一致，如果不一致就不是回文
# 如果一致，则看剩余部分的是否是回文字符串


def hui_wen(s):
    '''
        该函数用来检查指定的字符串是否为回文，是就返回True，不是就返回False

        参数：
            s:就是要检查的字符串
    '''
    # 基线条件
    if len(s) < 2:
        # 如果长度小于2，则字符串一定是回文
        return True
    elif s[0] != s[-1]:
        # 如果第一个字符串和最后一个字符串不等，则字符创就不是回文
        return False
    # 递归条件
    return hui_wen(s[1:-1])


# def hui_wen(s):
#     '''
#         该函数用来检查指定的字符串是否为回文，是就返回True，不是就返回False

#         参数：
#             s:就是要检查的字符串
#     '''
#     # 基线条件
#     if len(s) < 2:
#         # 如果长度小于2，则字符串一定是回文
#         return True
#     # 如果第一个字符串和最后一个字符串不等，则字符创就不是回文
#     # 递归条件
#     return s[0] == s[-1] and hui_wen(s[1:-1])

print(hui_wen('abcba'))
print(hui_wen('hello'))
